#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <boost/algorithm/string.hpp>
#include"cppjieba/Jieba.hpp"
namespace ns_util
{
  class FileUtil
  {
  public:
    // 将文件内容读到output中
    static bool ReadFile(const std::string &file_path, std::string *output)
    {
      std::ifstream in(file_path, std::ios::in);
      if (!in.is_open())
      {
        std::cerr << "file open fail" << file_path << std::endl;
        return false;
      }

      // line保存每次从getline中读出的一行内容
      std::string line;
      // getline 函数的返回值是输入流对象的引用（如 istream&）。当流处于有效状态时，返回值可隐式转换为 bool 类型的 true；当遇到文件末尾或错误时，返回 false。
      while (std::getline(in, line)) // 用getline把文件内容读到line中再+=到output中输出给外边 因为getline中重载了强制类型转换函数 所以当读到空的时候可以结束while循环
      {
        *output += line;
      }
      in.close();
      return true;
    }
  };
  class StringUtil
  {
  public:
  //-----------------------------------------------------------------------------------代码有错
    static void CutString(const std::string &inputstring, std::vector<std::string> &out, std::string &sep)
    {
      // inputstring 是输入的字符串 vector<string> 是切割好后的字符数组 out[0]=title out[1]=content out[2]=url
      // 对字符串进行切割直接调用boost库中的方法 split
      //           template<typename SequenceSequenceT, typename RangeT, typename PredicateT>
      // SequenceSequenceT& split(
      //     SequenceSequenceT& Result,
      //     const RangeT& Input,
      //     PredicateT Pred,
      //     boost::algorithm::token_compress_mode_type eCompress = boost::algorithm::token_compress_off
      // );
      // Result：存储分割结果的容器（如 std::vector<std::string>）。
      // Input：需要分割的字符串。
      // Pred：分隔符谓词，可以是字符、字符串或函数对象。
      // eCompress：是否压缩连续的分隔符（可选，默认不压缩）
      // boost::split(tokens, str, boost::is_any_of(","));
      boost::split(out, inputstring, boost::is_any_of(sep), boost::algorithm::token_compress_on);
    }
  };
  const char *const DICT_PATH = "./dict/jieba.dict.utf8";
  const char *const HMM_PATH = "./dict/hmm_model.utf8";
  const char *const USER_DICT_PATH = "./dict/user.dict.utf8";
  const char *const IDF_PATH = "./dict/idf.utf8";
  const char *const STOP_WORD_PATH = "./dict/stop_words.utf8";
  class JiebaUtil
  {
  public:
  //分词函数
    static void CutString(const std::string & src , std::vector<std::string> *out)
    {
      jieba.CutForSearch(src, *out);
    }
  private:
    static cppjieba::Jieba jieba;

  };
   cppjieba::Jieba JiebaUtil::jieba(DICT_PATH,HMM_PATH,USER_DICT_PATH);
}